package com.xhui.vimarket.zkplus.utils.zul;

import java.util.List;

import org.zkoss.zk.ui.Component;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listitem;

import com.xhui.vimarket.common.utils.string.StrUtil;
import com.xhui.vimarket.common.utils.vo.NodeVo;

/**
 * .
 * 
 * @author zfz
 * @version Revision 1.0.0
 */
public final class ListboxUtils {
    
    /**
     * .
     */
    private ListboxUtils() {
        
    }
    
    /**
     * 方法功能:
     * 按照传入条件，控件对象，似乎否空，是否全部来进行下拉框的取值设置.
     * 
     * @param
     * @return
     * @param listbox
     *            Listbox
     * @param codes
     *            List<NodeVo>
     * @param empty
     *            boolean
     * @param all
     *            boolean
     * @param selectedValue
     *            设置选择项
     * @author: Liuzhuangfei
     * @修改记录：
     *        ==============================================================<br>
     *        日期:2010-12-22 Liuzhuangfei 创建方法，并实现其功能
     *        ==============================================================<br>
     */
    public static void rendererByCode(final Listbox listbox, final List<NodeVo> codes,
        final boolean empty, final boolean all, final String selectedValue) {
        if (listbox != null && listbox.getItems() != null && listbox.getItems().size() > 0) {
            listbox.getItems().clear();
        }
        if (listbox == null || codes == null) {
            return; // throw new IllegalArgumentException("传入的组件或者是值编码不能为空!");
        }
        if (empty) {
            new Listitem().setParent(listbox);
        }
        if (all) {
            new Listitem("请选择...").setParent(listbox);
        }
        for (final NodeVo code : codes) {
            final Listitem item = new Listitem(code.getName());
            item.setValue(code.getId());
            //2012-4-1 linzhiqiang 增加提示 
            item.setTooltiptext(code.getId());
            item.setParent(listbox);
            if (selectedValue != null && selectedValue.length() > 0) {
                if (selectedValue.equals(code.getId())) {
                    item.setSelected(true);
                }
            } else {
                if (code.isDefault()) {
                    item.setSelected(true);
                }
            }
        }
        if (listbox.getItems().size() != 0 && listbox.getSelectedItem() == null) {
            listbox.setSelectedIndex(0);
        }
    }
    
    public static void rendererByCode(final Listbox listbox, final List<NodeVo> codes,
        final boolean empty, final boolean all) {
        ListboxUtils.rendererByCode(listbox, codes, empty, all, null);
    }
    
    /**
     * 方法功能:
     * 按照传入条件，控件对象，似乎否空，是否全部来进行下拉框的取值设置.
     * @param listbox Listbox
     * @param String List<String>
     * @author wuyx
     * 2011-7-6 wuyx 
     */
    public static void render(final Listbox listbox, final List<String> slist) {
        if (listbox != null && listbox.getItems() != null && listbox.getItems().size() > 0) {
            listbox.getItems().clear();
        }
        for (final String str : slist) {
            final Listitem item = new Listitem(str);
            item.setValue(str);
            item.setParent(listbox);
        }
        if (listbox.getItems().size() != 0 && listbox.getSelectedItem() == null) {
            listbox.setSelectedIndex(0);
        }
    }
    
    /**
     * .
     * 
     * @param listbox
     *            Listbox
     * @param nodeVos
     *            List<NodeVo>
     */
    public static void rendererForQuery(final Listbox listbox, final List<NodeVo> nodeVos) {
        ListboxUtils.rendererByCode(listbox, nodeVos, false, true);
    }
    
    /**
     * .
     * 
     * @param listbox
     *            Listbox
     * @param nodeVos
     *            List<NodeVo>
     */
    public static void rendererForEdit(final Listbox listbox, final List<NodeVo> nodeVos) {
        ListboxUtils.rendererByCode(listbox, nodeVos, true, false);
    }
    
    /**
     * .
     * 
     * @param listbox
     *            Listbox
     * @param value
     *            String
     */
    public static void selectByCodeValue(final Listbox listbox, final String value) {
        if (listbox == null) {
            return;
            // throw new IllegalArgumentException("listbox must not null!");
        }
        for (final Object object : listbox.getItems()) {
            final Listitem item = (Listitem) object;
            final String itemValue = (String) item.getValue();
            if (!StrUtil.isNullOrEmpty(itemValue) && itemValue.toString().equals(value)) {
                item.setSelected(true);
                return;
            } else if (value == null || "".equals(value)) {
                item.setSelected(true);
                return;
            }
        }
    }
    
    /**
     * selectFirstItem.
     * 
     * @param listbox Listbox
     * @author wuyx
     * 2011-1-29 wuyx 
     */
    public static void selectFirstItem(final Listbox listbox) {
        if (listbox != null && listbox.getItems().size() != 0) {
            listbox.setSelectedIndex(0);
        }
    }
    
    /**
     * 获取下拉框值.
     * 
     * @param listbox Listbox
     * @return Object
     * @author wuyx
     * 2011-4-27 wuyx 
     */
    public static Object getSelectedValue(final Listbox listbox) {
        if (listbox != null && listbox.getSelectedItem() != null) {
            return listbox.getSelectedItem().getValue();
        }
        return null;
    }
    
    /**
     * 
     * 方法功能:
     *  .
     * @param listbox
     * @author: chenmq
     * @修改记录： 
     * ==============================================================<br>
     * 日期:2011-5-28 chenmq 创建方法，并实现其功能
     * ==============================================================<br>
     */
    public static void clearListbox(Listbox listbox) {
        if (listbox == null || listbox.getItemCount() <= 0) {
            return;
        }
        int len = listbox.getItemCount();
        for (int i = len - 1; i >= 0; i--) {
            listbox.removeItemAt(i);
        }
    }
    
    /**
     * 
     * 方法功能:
     *  取消选中的记录.
     * @param listbox
     * @author: chenmq
     * @修改记录： 
     * ==============================================================<br>
     * 日期:2011-11-7 chenmq 创建方法，并实现其功能
     * ==============================================================<br>
     */
    public static void disSelected(Listbox listbox) {
        int count = listbox.getSelectedCount();
        if (count < 1) {
            return;
        }
        for (int i = 0; i < count; i++) {
            listbox.getSelectedItem().setSelected(false);
        }
    }
    
    /**
     * 
     * 方法功能: .
     * 对listbox的已选择的行进行标记 （中间加下划线）
     * @param item
     * @param flag true  标记  flase 不标记
     * @author chenmq
     * 2012-3-10 chenmq 
     * @修改记录： 
     * ==============================================================<br>
     * 日期:2012-3-10 chenmq 创建方法，并实现其功能
     * ==============================================================<br>
     */
    public static void signedSelected(Listitem item, boolean flag) {
        if (item == null) {
            return;
        }
        List<Component> cList = item.getChildren();
        if (cList != null && cList.size() > 0) {
            for (Component cell : cList) {
                if (flag)
                    ((Listcell)cell).setZclass("zp-removed");
                else {
                	((Listcell)cell).setZclass("");
                }
            }
        }
    }
}
